Greatest sum divisible by three¶
Time: O(N); Space: O(1); medium
Given an array nums of integers, we need to find the maximum possible sum of elements of the array such that it is divisible by three.
Example 1:
Input: nums = [3,6,5,1,8]
Output: 18
Explanation:
Pick numbers 3, 6, 1 and 8 their sum is 18 (maximum sum divisible by 3).
Example 2:
Input: nums = [4]
Output: 0
Explanation:
Since 4 is not divisible by 3, do not pick any number.
Example 3:
Input: nums = [1,2,3,4,4]
Output: 12
Explanation:
Pick numbers 1, 3, 4 and 4 their sum is 12 (maximum sum divisible by 3).
Constraints:
1 <= len(nums) <= 4 * 10^4
1 <= nums[i] <= 10^4
Hints:
Represent the state as DP[pos][mod]: maximum possible sum starting in the position “pos” in the array where the current sum modulo 3 is equal to mod.
1. Dynamic programming [O(N), O(1)]¶
[1]:
class Solution1(object):
"""
Time: O(N)
Space: O(1)
"""
def maxSumDivThree(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dp = [0, 0, 0]
for num in nums:
for i in [num+x for x in dp]:
dp[i%3] = max(dp[i%3], i)
return dp[0]
[2]:
s = Solution1()
nums = [3,6,5,1,8]
assert s.maxSumDivThree(nums) == 18
nums = [4]
assert s.maxSumDivThree(nums) == 0
nums = [1,2,3,4,4]
assert s.maxSumDivThree(nums) == 12